class Solution {
public:
    int minOperations(vector<int>& nums) {
        int n = nums.size();
        int ans = 0;
        int flip = 0;  // 当前位置的反转次数
        vector<int> diff(n + 3, 0);  // 记录每个位置的反转次数
        
        for (int i = 0; i < n; i++) {
            flip += diff[i];
            
            // 当前位置是0且在该位置翻转了偶数次(等于没翻转),则需要反转
            if ((nums[i] ^ (flip & 1)) == 0) {
                if (i + 3 > n) {  // 越界检查
                    return -1;
                }
                ans++;
                flip++;  // 增加反转次数
                diff[i + 3]--;  // 在终止位置后一位减1
                //因为每次都diff[i]+filp,在0位置翻转,那么在diff[3]变为-1
                //到nums[3],flip=1,则flip+=-1 即filp=0,表示该位置没翻转过
                
            }
        }
        return ans;
    }
};